import pandas as pd
import numpy as np
import os
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import traceback

# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 1. 数据加载与预处理
def load_and_preprocess_data(filepath):
    df = pd.read_csv(filepath)
    df['日期'] = pd.to_datetime(df['日期'])
    df['星期'] = df['星期'].astype(str).str.strip()
    # 创建星期标签映射
    weekday_mapping = {'0': '周一', '2': '周三', '5': '周六'}
    df['星期标签'] = df['星期'].map(weekday_mapping)
    # 按日期排序
    df.sort_values('日期', inplace=True)
    return df

# 2. 数据分析与可视化
def analyze_and_visualize(df):
    plt.figure(figsize=(14, 10))
    ax = plt.subplot(211)
    ax.plot(df['日期'], df['销售金额'] / 1e8, 'o-',
             linewidth=1.5, markersize=4, color='#1f77b4')
    ax.set_title('大乐透销售额随时间变化趋势 (2024-2025)',
                  fontsize=14, fontweight='bold')
    ax.set_ylabel('销售额(亿元)', fontsize=12)
    ax.grid(True, linestyle='--', alpha=0.7)

    # 设置日期格式
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
    ax.xaxis.set_major_locator(mdates.MonthLocator())
    plt.xticks(rotation=45)

    plt.tight_layout()
    plt.savefig('images/sales_trends.png', dpi=300, bbox_inches='tight')
    plt.close()


def predict_sales(df, target_date='2025-07-02'):
    # 1. 提取日期特征
    df['日期'] = pd.to_datetime(df['日期'])
    df['星期'] = df['日期'].dt.dayofweek

    # 2. 确定目标日期的星期几
    target_day = pd.to_datetime(target_date).dayofweek

    # 3. 提取历史数据中的相同星期几数据
    same_day_data = df[df['星期'] == target_day]

    # 4. 使用加权移动平均预测
    recent_data = same_day_data['销售金额'].tail(4).values
    weights = np.array([0.1, 0.2, 0.3, 0.4])  # 最近的数据权重最高
    forecast = np.dot(recent_data, weights)

    # 5. 转换为亿元单位并打印结果
    forecast_billions = forecast / 100000000
    weekday_names = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
    print(f"预测销售额: {forecast_billions:.2f}亿元 (日期: {target_date}, 星期: {weekday_names[target_day]})")


# 主函数 (增强异常处理)
def main():
    if not os.path.exists("images"):
        os.makedirs("images")
    try:
        # 加载数据
        filepath = 'csv/dlt_lottery_numbers.csv'
        df = load_and_preprocess_data(filepath)

        # 分析可视化
        print("数据分析中...")
        analyze_and_visualize(df)
        print("趋势分析已完成，图表保存为 'sales_trends.png'")

        # 预测2025-07-02销售额
        predict_sales(df)

    except Exception as e:
        print(f"程序发生错误: {str(e)}")
        print(traceback.format_exc())

if __name__ == "__main__":
    main()